GtkStyleSet: Allow custom parsers on registered properties.
authorCarlos Garnacho <carlosg@gnome.org>
Wed, 4 Aug 2010 15:49:15 +0000 (17:49 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Sat, 4 Dec 2010 14:37:35 +0000 (15:37 +0100)
gtk/gtkcssprovider.c
gtk/gtkstyleset.c
gtk/gtkstyleset.h

index b0d41b4b60e4929734df44ea50e4f8a20e5415e0..2cb90442dbab2823c1adec1c813c420a74082c39 100644 (file)
@@ -1398,7 +1398,9 @@ parse_rule (GtkCssProvider *css_provider,
   while (scanner->token == G_TOKEN_IDENTIFIER)
     {
       const gchar *value_str = NULL;
+      GtkStylePropertyParser parse_func = NULL;
       GType prop_type;
+      GError *error = NULL;
       gchar *prop;
 
       prop = g_strdup (scanner->value.v_identifier);
@@ -1432,7 +1434,7 @@ parse_rule (GtkCssProvider *css_provider,
 
           g_hash_table_insert (priv->cur_properties, prop, val);
         }
-      else if (gtk_style_set_lookup_property (prop, &prop_type))
+      else if (gtk_style_set_lookup_property (prop, &prop_type, &parse_func))
         {
           GValue *val;
 
@@ -1444,10 +1446,17 @@ parse_rule (GtkCssProvider *css_provider,
               g_value_set_string (val, value_str);
               g_hash_table_insert (priv->cur_properties, prop, val);
             }
-          else if (css_provider_parse_value (value_str, val))
+          else if ((parse_func && (parse_func) (value_str, val, &error)) ||
+                   (!parse_func && css_provider_parse_value (value_str, val)))
             g_hash_table_insert (priv->cur_properties, prop, val);
           else
             {
+              if (error)
+                {
+                  g_warning ("Error parsing property value: %s\n", error->message);
+                  g_error_free (error);
+                }
+
               g_value_unset (val);
               g_slice_free (GValue, val);
               g_free (prop);
index f1b0b357096519a6fa0ebedd3ebfba25e111de68..d2053db7ac533c19c59f7361a452d104e127569c 100644 (file)
@@ -39,6 +39,7 @@ struct PropertyNode
   GQuark property_quark;
   GType property_type;
   GValue default_value;
+  GtkStylePropertyParser parse_func;
 };
 
 struct PropertyData
@@ -72,19 +73,19 @@ gtk_style_set_class_init (GtkStyleSetClass *klass)
   object_class->finalize = gtk_style_set_finalize;
 
   /* Initialize default property set */
-  gtk_style_set_register_property ("foreground-color", GDK_TYPE_COLOR, NULL);
-  gtk_style_set_register_property ("background-color", GDK_TYPE_COLOR, NULL);
-  gtk_style_set_register_property ("text-color", GDK_TYPE_COLOR, NULL);
-  gtk_style_set_register_property ("base-color", GDK_TYPE_COLOR, NULL);
+  gtk_style_set_register_property ("foreground-color", GDK_TYPE_COLOR, NULL, NULL);
+  gtk_style_set_register_property ("background-color", GDK_TYPE_COLOR, NULL, NULL);
+  gtk_style_set_register_property ("text-color", GDK_TYPE_COLOR, NULL, NULL);
+  gtk_style_set_register_property ("base-color", GDK_TYPE_COLOR, NULL, NULL);
 
-  gtk_style_set_register_property ("font", PANGO_TYPE_FONT_DESCRIPTION, NULL);
+  gtk_style_set_register_property ("font", PANGO_TYPE_FONT_DESCRIPTION, NULL, NULL);
 
-  gtk_style_set_register_property ("padding", GTK_TYPE_BORDER, NULL);
-  gtk_style_set_register_property ("border", G_TYPE_INT, NULL);
+  gtk_style_set_register_property ("padding", GTK_TYPE_BORDER, NULL, NULL);
+  gtk_style_set_register_property ("border", G_TYPE_INT, NULL, NULL);
 
   g_value_init (&val, GTK_TYPE_THEMING_ENGINE);
   g_value_set_object (&val, (GObject *) gtk_theming_engine_load (NULL));
-  gtk_style_set_register_property ("engine", GTK_TYPE_THEMING_ENGINE, &val);
+  gtk_style_set_register_property ("engine", GTK_TYPE_THEMING_ENGINE, &val, NULL);
   g_value_unset (&val);
 
   g_type_class_add_private (object_class, sizeof (GtkStyleSetPrivate));
@@ -186,9 +187,10 @@ property_node_lookup (GQuark quark)
 
 /* Property registration functions */
 void
-gtk_style_set_register_property (const gchar  *property_name,
-                                 GType         type,
-                                 const GValue *default_value)
+gtk_style_set_register_property (const gchar            *property_name,
+                                 GType                   type,
+                                 const GValue           *default_value,
+                                 GtkStylePropertyParser  parse_func)
 {
   PropertyNode *node, new = { 0 };
   GQuark quark;
@@ -220,6 +222,9 @@ gtk_style_set_register_property (const gchar  *property_name,
       g_value_copy (default_value, &new.default_value);
     }
 
+  if (parse_func)
+    new.parse_func = parse_func;
+
   for (i = 0; i < properties->len; i++)
     {
       node = &g_array_index (properties, PropertyNode, i);
@@ -232,8 +237,9 @@ gtk_style_set_register_property (const gchar  *property_name,
 }
 
 gboolean
-gtk_style_set_lookup_property (const gchar *property_name,
-                               GType       *type)
+gtk_style_set_lookup_property (const gchar            *property_name,
+                               GType                  *type,
+                               GtkStylePropertyParser *parse_func)
 {
   PropertyNode *node;
   GtkStyleSetClass *klass;
@@ -261,6 +267,9 @@ gtk_style_set_lookup_property (const gchar *property_name,
           if (type)
             *type = node->property_type;
 
+          if (parse_func)
+            *parse_func = node->parse_func;
+
           found = TRUE;
           break;
         }
index 6b828345ac220c0865aa79e90bc79b932c06067d..cf46a2fab5ad73b3d4652ab93986192bec52e18d 100644 (file)
@@ -48,14 +48,20 @@ struct GtkStyleSetClass
   GObjectClass parent_class;
 };
 
+typedef gboolean (* GtkStylePropertyParser) (const gchar  *string,
+                                             GValue       *value,
+                                             GError      **error);
+
 GType gtk_style_set_get_type (void) G_GNUC_CONST;
 
 /* Functions to register style properties */
-void     gtk_style_set_register_property (const gchar  *property_name,
-                                          GType         type,
-                                          const GValue *default_value);
-gboolean gtk_style_set_lookup_property   (const gchar  *property_name,
-                                          GType        *type);
+void     gtk_style_set_register_property (const gchar            *property_name,
+                                          GType                   type,
+                                          const GValue           *default_value,
+                                          GtkStylePropertyParser  parse_func);
+gboolean gtk_style_set_lookup_property   (const gchar            *property_name,
+                                          GType                  *type,
+                                          GtkStylePropertyParser *parse_func);
 
 GtkStyleSet * gtk_style_set_new (void);